#include "generic.h"

Generic::Generic(void)
{
}

Generic::~Generic(void)
{
}


/*
	Gemaakt door: Gerco Koks
	generieke convolutie functie die voor meerdere filters te gebruiken zijn.
*/
bool Generic::convolute( Image &imgPadded, Image &imgResult, int paddedSize, Mask m )
{
	// members
	unsigned int row, col, chan;
	float sum;

	// loop door de rijen
	for( row = paddedSize; row < (imgPadded.height() - paddedSize); row++ )
		// loop door de kolommen
		for( col = paddedSize; col < (imgPadded.width() - paddedSize); col++ )
			// loop door de channels
			for( chan = 0; chan < 3; chan++ )
			{
				// sum iedere keer op 0 zetten
				sum = 0;
				// sum berekeken door de volgende formule:
				// origineel( x,y ) * mask( x,y ) waarbij alle berekende waardes bij 
				// elkaar opgeteld worden
				sum = 
				(imgPadded[row-1][col-1][chan]	*	(float)m.topLeft) +
				(imgPadded[row][col-1][chan]	*	(float)m.topMid) +
				(imgPadded[row+1][col-1][chan]	*	(float)m.topRight) +
				(imgPadded[row-1][col][chan]	*	(float)m.midLeft) +
				(imgPadded[row][col][chan]		*	(float)m.midMid) +
				(imgPadded[row+1][col][chan]	*	(float)m.midRight) +
				(imgPadded[row-1][col+1][chan]	*	(float)m.bottomLeft) +
				(imgPadded[row][col+1][chan]	*	(float)m.bottomMid) +
				(imgPadded[row+1][col+1][chan]	*	(float)m.bottomRight);
				
				// dit is per filter afhankelijk
				sum = (sum / m.factor) + m.offset;
				
				// groter dan 255 dan 255
				// kleiner dan 0 dan 0
				sum = ( sum > 255 ) ? 255 : ( sum < 0 ) ? 0 : sum;

				// stuur het resultaat op naar de nieuwe afbeelding
				imgResult[row - paddedSize][col - paddedSize][chan] = (unsigned char)sum;
			}
	// en klaar is kees
	return true;
}


/*
	Gemaakt door Bas Janssens
	Bijgewerkt door Gerco Koks

	voert een conversie uit van RBG naar grayscale en retourneert de Image
*/
Image Generic::covertToGrayscale( Image img )
{
	// Gemaakt door Bas Janssens
	double value = 0.0;

	// members
	unsigned int row, col, chan;

	// loop door de rijen
	for( row = 0; row < img.height(); row++ )
	{
		// loop door de kolommen
		for( col = 0; col < img.width(); col++ )	   //kolommen
		{
			value = 0.0;
			// loop door de channels
			for( chan = 0; chan < 3; chan++ )
			{
				//voor pixels in channel 0 wordt vermenigvuldigt met 0.11 en toegekent aan value
				if(chan == 0)
					value += (img[ row ][ col ][ chan ] ) * 0.11;
				//voor pixels in channel 1 wordt vermenigvuldigt met 0.59 en opgeteld bij value
				if(chan == 1)
					value += (img[ row ][ col ][ chan ] ) * 0.59;
				//voor pixels in channel 2 wordt vermenigvuldigt met 0.3 en opgeteld aan value
				if(chan == 2)
					value += (img[ row ][ col ][ chan ] ) * 0.3;
			}

			int gray = (int)value;
			
			// niet groter dan 255 en kleiner dan 0
			gray = ( gray > 255 ) ? 255 : ( gray < 0 ) ? 0 : gray;
			
			// de waarde in gray wordt aan alle channels toegekend
			for (chan = 0; chan < 3; chan++)
				img[ row ][ col ][ chan ] = (byte)gray;
		}
	}
	return img;
}